Create a Graphics Pipeline
本章节代码在14-init_pipeline.cpp
文件中。
我们将更进一步把所有之前进行的步骤放到一起去画立方体。接下来,我们通过设置图形管线(graphics pipeline)来设置渲染的GPU。
图形管线由着色器阶段、管线布局、渲染通道和固定功能的管线阶段。在以前的章节中定义了着色器阶段和管线布局。在此,将设置余下的固定功能的管线阶段。包括填充一些创建管线的”create info”数据结构。在将图像片元(fragments)放到帧缓存之前,这里完成的大部分工作是设置预片段(per-fragment)操作。简图如下:
下一步将设置管线状态对象,即上图中右下角的灰色框。最后一步是连接其它对象指向左上角的紫色管线框,为了完成图形管线的定义。
Dynamic State
在命令缓冲区运行期间,动态管线状态(Dynamic State)是能被命令缓冲区改变的。预先通知哪些状态是动态状态对驱动器可能有用,因为它可能会为命令缓存的执行创建GPU对象。
样例提供了一个在命令缓存执行期间会改变状态的状态列表。在此,代码以创建动态状态列表开始,开始时这些动状态都是disabled。
样例表明样例将使用命令缓存动态地改变一些状态,所以,当设置视区(viewport)和剪切(scissors)矩形时,样例会改变dynamicStateEnables
数组。代码通过修改dynamicStateEnables
来保持清楚地设置viewport和scissors。
Pipeline Vertex Input State
当创建vertex buffer时,我们已经对vertex输入状态进行了初始化,因为它在创建时就直接完成了。输入状态包括顶点数据的格式和管理。可以回顾vertexbuffer样例去查看vi_binding
和vi_attribs
变量是如何设置的。
Pipeline Vertex Input Assembly State
输入组件的状态(input assembly state)主要是什么时候声明顶点如何从我们想要画的几何图形中得到。例如,顶点可能形成三角带(triangle strip)和三角扇(triangle fan)。这里,我们仅仅用三角形列表,每三个点描述一个三角形。
Pipeline Rasterization State
在GPU中,下面的数据结构设置了光栅化(rasterization)操作。
用常见值设置这些字段。我们可以通过GL函数glFrontFace()
的来识别frontFace
成员。
Pipeline Color Blend State
绑定是另一个end of the fixed pipe
操作,即在目的地设置像素的简单替换。
注意,在每个附件基础(per-attachment basis)上,我们都提供了一些配置信息的。在管线中,每一个颜色附件需要一个VkPipelineColorBlendAttachmentState
。在这种情况下,这里只有一个颜色附件。
colorWriteMask
从R, G, B(, A)四个类型中选择出支持写(writing)的组件(components)。这里,可以选择这4个组件。
我们禁用了blendEnable
,表示剩下的att_state[0]
中的设置与绑定(blending)并不是至关紧要的。
我们也可以禁用pixel-writing逻辑操作,因为,这个样例仅仅在写像素到帧缓存时做了一个简单的替换。
绑定常量用于一些”blend factors”(如,VK_BLEND_FACTOR_CONSTANT_COLOR
),或仅是用于设置一些东西使其合理,但在这个样例没有使用到。
Pipeline Viewport State
draw_cube样例在命令缓存中用命令设置视口(viewport)和裁剪(scissors)矩形。下面的代码告诉驱动哪些viewport和scissors状态是动态的,并忽略pViewPorts
和pScissors
成员。
Pipeline Depth Stencil State
紧接着,通过建立共用配置和禁用模版操作(stencil operations)来完成后端固定功能( fixed-function)的初始化:
因为我们想使用深度缓存,所以开启了深度缓存writing和testing。此外,一般使用VK_COMPARE_OP_LESS_OR_EQUAL
设置深度缓存比较操作。最后,我们禁用了模板(stencil)操作,由于这个样例并不需要它。
Pipeline Multisample State
这个例子我们不打算做任何精细的多采样,所以通过建立无多采样来完成管线设置。
Pulling It All Together - Create Graphics Pipeline
最后,我们综合所有需要的信息来创建管线。
info.pipeline_layout
、info.shaderStages
和and info.render_pass
成员已在以前的章节初始化。这个结构中的余下成员在本章节设置。
本篇Vulkan Samples Tutorial原文是LUNAEXCHANGE中的Vulkan Tutorial的译文。
并非逐字逐句翻译,如有错误之处请告知。O(∩_∩)O谢谢~~